#ifndef HITLIST_DAEMON_CONFIGURE_HPP
#define HITLIST_DAEMON_CONFIGURE_HPP

#include <string>

/** @brief Конфигурация демона */
struct configure
{
  /// Адрес tcp сервиса, м.б. ""
  std::string tcp_addr;
  /// Порт tcp сервиса, 0 - отключен
  unsigned short tcp_port;

  /// Адрес udp сервиса, м.б. ""
  std::string udp_addr;
  /// Порт udp сервиса, 0 - отключен
  unsigned short udp_port;

  /// максимальный интервал времени между хитами в которм хит считается за один (сек)
  time_t hit_interval;
  /// время жизни кэша уникальных хитов (сек)
  time_t prepared_timelife;
  /// дней в месяце (сколько дней хранить сообщение)
  time_t days_in_month;
  /// интервал запуска процедуры очистки устаревших хитов (сек)
  time_t idle_timeout;
  /// количество юзеров у которых чистятся хиты за одну итерацию (сек)
  size_t idle_count;
  /// начиная с какого дня востанавливать (30 - месячная давность)
  time_t backup_day_ago;
  /// Задать маску формирования файла json backup'а "./backup_binary/backup_%d.binary". Пустая строка - не использовать
  std::string backup_format_binary;
  /// Задать маску формирования файла json backup'а "./backup_json/backup_%d.json". Пустая строка - не использовать
  std::string backup_format_json;

  configure()
    : tcp_port(12345)
    , udp_port(0)
    , hit_interval(60)
    , prepared_timelife(60*10)
    , days_in_month(30)
    , idle_timeout(60*10)
    , idle_count(1000)
    , backup_day_ago(30)
    , backup_format_json("./backup_json/backup_%d.json")
  {}
};

#define CNAME(X) struct n_##X { const char* operator()() const{ return #X;} };
CNAME(tcp_addr)
CNAME(tcp_port)
CNAME(udp_addr)
CNAME(udp_port)
CNAME(hit_interval)
CNAME(prepared_timelife)
CNAME(days_in_month)
CNAME(idle_timeout)
CNAME(idle_count)
CNAME(backup_day_ago)
CNAME(backup_format_binary)
CNAME(backup_format_json)
CNAME(backup_path_binary)
CNAME(backup_path_json)

#include <fas/misc/json.hpp>

namespace aj = ::fas::json;
namespace ap = ::fas::pattern;

typedef
  aj::object<
    configure,
    ap::type_list_n<
      aj::member<n_tcp_addr,  configure, std::string, &configure::tcp_addr>,
      aj::member<n_tcp_port,  configure, unsigned short, &configure::tcp_port>,
      aj::member<n_udp_addr,  configure, std::string, &configure::udp_addr>,
      aj::member<n_udp_port,  configure, unsigned short, &configure::udp_port>,

      aj::member<n_hit_interval, configure, time_t, &configure::hit_interval>,
      aj::member<n_prepared_timelife, configure, time_t, &configure::prepared_timelife>,
      aj::member<n_days_in_month, configure, time_t, &configure::days_in_month>,
      ap::type_list_n<
        aj::member<n_idle_timeout, configure, time_t, &configure::idle_timeout>,
        aj::member<n_idle_count, configure, size_t, &configure::idle_count>,
        aj::member<n_backup_day_ago, configure, time_t, &configure::backup_day_ago>,
        aj::member<n_backup_format_binary,  configure, std::string, &configure::backup_format_binary>,
        aj::member<n_backup_format_json,  configure, std::string, &configure::backup_format_json>
      >::type
    >::type
  > configure_json;


#endif
